From 59d85d42cf9c727e6d5adc673de928cdaac0a5a6 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Mon, 13 Jul 2020 16:22:22 +0100 Subject: [PATCH] a11y: Update the accessible state for GtkRange --- gtk/gtkrange.c | 55 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c index dc2a90b2bf..0277fc8c4a 100644 --- a/gtk/gtkrange.c +++ b/gtk/gtkrange.c @@ -27,8 +27,10 @@ #include "gtkrangeprivate.h" +#include "gtkaccessible.h" #include "gtkadjustmentprivate.h" #include "gtkcolorscaleprivate.h" +#include "gtkenums.h" #include "gtkeventcontrollerkey.h" #include "gtkeventcontrollerscroll.h" #include "gtkgesturedrag.h" @@ -240,6 +242,9 @@ static gboolean gtk_range_scroll_controller_scroll (GtkEventControllerScrol double dy, GtkRange *range); +static void gtk_range_set_orientation (GtkRange *range, + GtkOrientation orientation); + G_DEFINE_TYPE_WITH_CODE (GtkRange, gtk_range, GTK_TYPE_WIDGET, G_ADD_PRIVATE (GtkRange) G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, @@ -437,18 +442,11 @@ gtk_range_set_property (GObject *object, GParamSpec *pspec) { GtkRange *range = GTK_RANGE (object); - GtkRangePrivate *priv = gtk_range_get_instance_private (range); switch (prop_id) { case PROP_ORIENTATION: - if (priv->orientation != g_value_get_enum (value)) - { - priv->orientation = g_value_get_enum (value); - gtk_widget_update_orientation (GTK_WIDGET (range), priv->orientation); - gtk_widget_queue_resize (GTK_WIDGET (range)); - g_object_notify_by_pspec (object, pspec); - } + gtk_range_set_orientation (range, g_value_get_enum (value)); break; case PROP_ADJUSTMENT: gtk_range_set_adjustment (range, g_value_get_object (value)); @@ -584,6 +582,27 @@ gtk_range_init (GtkRange *range) gtk_widget_add_controller (GTK_WIDGET (range), controller); } +static void +gtk_range_set_orientation (GtkRange *range, + GtkOrientation orientation) +{ + GtkRangePrivate *priv = gtk_range_get_instance_private (range); + + if (priv->orientation != orientation) + { + priv->orientation = orientation; + + gtk_accessible_update_property (GTK_ACCESSIBLE (range), + GTK_ACCESSIBLE_PROPERTY_ORIENTATION, priv->orientation, + -1); + + gtk_widget_update_orientation (GTK_WIDGET (range), priv->orientation); + gtk_widget_queue_resize (GTK_WIDGET (range)); + + g_object_notify (G_OBJECT (range), "orientation"); + } +} + /** * gtk_range_get_adjustment: * @range: a #GtkRange @@ -657,6 +676,12 @@ gtk_range_set_adjustment (GtkRange *range, G_CALLBACK (gtk_range_adjustment_value_changed), range); + gtk_accessible_update_property (GTK_ACCESSIBLE (range), + GTK_ACCESSIBLE_PROPERTY_VALUE_MAX, gtk_adjustment_get_upper (adjustment), + GTK_ACCESSIBLE_PROPERTY_VALUE_MIN, gtk_adjustment_get_lower (adjustment), + GTK_ACCESSIBLE_PROPERTY_VALUE_NOW, gtk_adjustment_get_value (adjustment), + -1); + gtk_range_adjustment_changed (adjustment, range); gtk_range_adjustment_value_changed (adjustment, range); @@ -2281,15 +2306,21 @@ gtk_range_adjustment_changed (GtkAdjustment *adjustment, { GtkRange *range = GTK_RANGE (data); GtkRangePrivate *priv = gtk_range_get_instance_private (range); + double upper = gtk_adjustment_get_upper (priv->adjustment); + double lower = gtk_adjustment_get_lower (priv->adjustment); - if (gtk_adjustment_get_upper (priv->adjustment) == gtk_adjustment_get_lower (priv->adjustment) && - GTK_IS_SCALE (range)) + if (upper == lower && GTK_IS_SCALE (range)) gtk_widget_hide (priv->slider_widget); else gtk_widget_show (priv->slider_widget); gtk_widget_queue_allocate (priv->trough_widget); + gtk_accessible_update_property (GTK_ACCESSIBLE (range), + GTK_ACCESSIBLE_PROPERTY_VALUE_MAX, upper, + GTK_ACCESSIBLE_PROPERTY_VALUE_MIN, lower, + -1); + /* Note that we don't round off to priv->round_digits here. * that's because it's really broken to change a value * in response to a change signal on that value; round_digits @@ -2316,6 +2347,10 @@ gtk_range_adjustment_value_changed (GtkAdjustment *adjustment, g_signal_emit (range, signals[VALUE_CHANGED], 0); + gtk_accessible_update_property (GTK_ACCESSIBLE (range), + GTK_ACCESSIBLE_PROPERTY_VALUE_NOW, gtk_adjustment_get_value (adjustment), + -1); + gtk_widget_queue_allocate (priv->trough_widget); } -- 2.30.2